package com.springboot.wisdom.serviceApi.mqtt.constant;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import com.fasterxml.jackson.annotation.JsonValue;
import com.springboot.wisdom.common.common.constant.BaseValueEnum;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;

@ApiModel(description = "Mqtt设备状态")
@ToString
@Getter
@AllArgsConstructor
public enum MqttDeviceStatusEnum implements BaseValueEnum {

    /**
     * 【1：关，2：开，3：异常关机】
     */
    // 未序列化成功的默认值。
    @JsonEnumDefaultValue
    NONE("-1", "NONE"),
    // 上电连接【首次】。
    REGISTER("0", "REGISTER"),
    // 上电连接。
    CONNECT("0", "CONNECT"),
    OFF("1", "OFF"),
    ON("2", "ON"),
    POWER_OFF("3", "POWER_OFF"),

    /**
     * 设备报警类型。
     */
    EXCESS_TEMPERATURE("600", "温度过高"),
    EXCESSIVE_HUMIDITY("601", "湿度过高"),
    SENSOR_INTERRUPT("602", "传感器异常"),
    ;

    @EnumValue // 标记数据库存的值是code
    private final String value;

    @JsonValue  // 序列化时使用此方法返回值
    private final String desc;


    /**
     * 根据code查找
     *
     * @param value 枚举值。
     * @return 枚举对象。未找到返回NONE
     */
    public static MqttDeviceStatusEnum findEnumByValue(String value) {
        for (MqttDeviceStatusEnum toEnum : MqttDeviceStatusEnum.values()) {
            if (toEnum.getValue().equalsIgnoreCase(value)) {
                //如果需要直接返回name则更改返回类型为String,return toEnum.name;
                return toEnum;
            }
        }
        return null;
    }

    /**
     * 根据name查找
     *
     * @param desc 枚举index。
     * @return 枚举对象
     */
    public static MqttDeviceStatusEnum findEnumByDesc(String desc) {
        for (MqttDeviceStatusEnum toEnum : MqttDeviceStatusEnum.values()) {
            if (toEnum.getValue().equalsIgnoreCase(desc)) {
                //如果需要直接返回code则更改返回类型为String,return toEnum.code;
                return toEnum;
            }
        }
        return null;
    }

    /**
     * 根据value获取Desc。
     *
     * @param value
     * @return
     */
    public static String findEnumByValueToDesc(String value) {
        MqttDeviceStatusEnum enumByValue = findEnumByValue(value);
        return ObjectUtil.isNotEmpty(enumByValue) ? enumByValue.getDesc() : null;
    }

    /**
     * 避免非正常值。
     *
     * @return
     */
    public static String findEnumByDescToDesc(String desc) {
        MqttDeviceStatusEnum enumByDesc = findEnumByDesc(desc);
        return ObjectUtil.isNotEmpty(enumByDesc) ? enumByDesc.getDesc() : null;
    }
}
